package com.zijidelu.luframework.infrastructure.persistence.repository.core;

import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
import com.zijidelu.luframework.base.model.DataModel;
import com.zijidelu.luframework.base.model.PO;
import com.zijidelu.luframework.infrastructure.model.api.PageQuery;
import com.zijidelu.luframework.infrastructure.model.api.PageResponse;
import com.zijidelu.luframework.infrastructure.persistence.repository.core.base.Repository;
import com.zijidelu.luframework.infrastructure.persistence.repository.core.bizsig.BizSigRepository;
import com.zijidelu.luframework.infrastructure.persistence.repository.core.data.DataRepository;
import com.zijidelu.luframework.infrastructure.persistence.repository.core.domain.calculator.DomainKeyCalculator;

/**
 * 统一仓储接口，集成基础数据操作、业务签名、领域计算等核心能力
 *
 * <p>该接口作为统一的数据访问入口，整合了以下多层能力：
 * <ul>
 *   <li><b>业务签名</b> - 集成 {@link BizSigRepository} 的业务数据签名验证</li>
 *   <li><b>数据处理</b> - 基于 {@link DataRepository} 的数据加工和转换</li>
 *   <li><b>领域计算</b> - 整合 {@link DomainKeyCalculator} 的领域键计算逻辑</li>
 * </ul>
 *
 * <p><b>设计目标：</b>通过统一接口简化多层级仓储的调用复杂度，提供一致的数据访问体验。
 *
 * @author ZIJIDELU
 * @datetime 2025/10/29 16:57
 */
public interface UnifiedRepository<P extends PO, D extends DataModel> extends Repository<P, D> {

    /**
     * 获取DTO数据仓库接口。
     *
     * @return DTO数据仓库接口
     */
    DataRepository<P, D> getDataRepository();

    /**
     * 获取唯一键DTO数据仓库接口。
     *
     * @return 唯一键DTO数据仓库接口
     */
    BizSigRepository<P, D> getBizSigRepository();

    /**
     * 获取领域键计算接口。
     *
     * @return 领域键计算接口
     */
    DomainKeyCalculator getDomainKeyCalculator();

    /**
     * 分页查询。
     *
     * @param pageQuery 分页查询条件
     * @return 分页查询结果
     */
    PageResponse<D> listPage(PageQuery<D> pageQuery);

    /**
     * 构建通用查询条件。
     * <p>
     * 继承类如需自定义查询条件，需重写此方法。
     *
     * @param data 数据
     * @return 查询条件
     */
    LambdaQueryChainWrapper<P> buildGenericQueryWrapper(D data);
}
